/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.dataprocess.gui.repository;
import net.codjo.dataprocess.common.model.ArgList;
import net.codjo.dataprocess.common.model.ArgModel;
import net.codjo.dataprocess.gui.util.GenericRenderer;
import java.awt.Component;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import static net.codjo.dataprocess.gui.repository.ArgumentsTable.COLUMN.NOM;
import static net.codjo.dataprocess.gui.repository.ArgumentsTable.COLUMN.POSITION;
import static net.codjo.dataprocess.gui.repository.ArgumentsTable.COLUMN.TYPE;
import static net.codjo.dataprocess.gui.repository.ArgumentsTable.COLUMN.VALEUR;
/**
*
*/
public class ArgumentsTable extends JTable {
enum COLUMN {
NOM(0, "Nom"),
VALEUR(1, "Valeur"),
POSITION(2, "Position"),
TYPE(3, "Type");
int columnPosition;
String columnName;
COLUMN(int columnPosition, String columnName) {
this.columnPosition = columnPosition;
this.columnName = columnName;
}
}
public static final boolean SQL_TYPE = true;
public static final boolean JAVA_TYPE = false;
private boolean sqlType = true;
public ArgumentsTable(int numRows, int numColumns) {
super(numRows, numColumns);
getTableHeader().setReorderingAllowed(false);
getTableHeader().setDefaultRenderer(new MyHeaderRenderer());
}
public boolean isSqlType() {
return sqlType;
}
public void initTableModel(boolean pSqlType) {
String[] columns;
this.sqlType = pSqlType;
if (sqlType) {
columns = new String[]{NOM.columnName, VALEUR.columnName, POSITION.columnName, TYPE.columnName};
}
else {
columns = new String[]{NOM.columnName, VALEUR.columnName};
}
DefaultTableModel execListModel = new DefaultTableModel(columns, 0);
setModel(execListModel);
setSelectionModel(new DefaultListSelectionModel());
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
EditorAutomaticCloser editorAutomaticCloser = new EditorAutomaticCloser(
(DefaultTableModel)getModel());
getModel().addTableModelListener(editorAutomaticCloser);
setCellRenderer(NOM.columnPosition, new MyTableCellRenderer());
setCellRenderer(VALEUR.columnPosition, new MyTableCellRenderer());
}
public ArgList getArglist() {
ArgList argList = new ArgList();
List<ArgModel> args = new ArrayList<ArgModel>();
DefaultTableModel defaultListModel = ((DefaultTableModel)getModel());
for (int i = 0; i < defaultListModel.getRowCount(); i++) {
String name = (String)defaultListModel.getValueAt(i, NOM.columnPosition);
String value = (String)defaultListModel.getValueAt(i, VALEUR.columnPosition);
int position = 0;
int type = 0;
if (sqlType) {
position = Integer.parseInt((String)defaultListModel.getValueAt(i, POSITION.columnPosition));
Object valueAt = defaultListModel.getValueAt(i, TYPE.columnPosition);
try {
type = (Integer)valueAt;
}
catch (ClassCastException e) {
type = Integer.parseInt((String)valueAt);
}
}
ArgModel argument = new ArgModel(name, value, position, type);
args.add(argument);
}
argList.setArgs(args);
return argList;
}
public void initSqlFormatStuff() {
Map<Integer, String> traductTable = new HashMap<Integer, String>();
traductTable.put(Types.VARCHAR, "Varchar");
traductTable.put(Types.NUMERIC, "Numeric");
traductTable.put(Types.DATE, "Date");
traductTable.put(Types.TIMESTAMP, "TimeStamp");
GenericRenderer renderer = new GenericRenderer(traductTable);
JComboBox typeComboBox = new JComboBox(traductTable.keySet().toArray());
typeComboBox.setRenderer(renderer);
setCellRenderer(NOM.columnPosition, new MyTableCellRenderer());
setCellRenderer(VALEUR.columnPosition, new MyTableCellRenderer());
setCellRenderer(POSITION.columnPosition, new MyTableCellRenderer());
setCellRenderer(TYPE.columnPosition, renderer);
setCellEditor(TYPE.columnPosition, new DefaultCellEditor(typeComboBox));
}
public void addRow() {
DefaultTableModel defaultListModel = ((DefaultTableModel)getModel());
defaultListModel.addRow(new Object[]{});
}
public void removeCurrentRow() {
DefaultTableModel defaultListModel = ((DefaultTableModel)getModel());
try {
defaultListModel.removeRow(selectionModel.getMinSelectionIndex());
}
catch (ArrayIndexOutOfBoundsException e) {
;
}
}
public void removeAllRows() {
DefaultTableModel defaultListModel = ((DefaultTableModel)getModel());
while (defaultListModel.getRowCount() != 0) {
defaultListModel.removeRow(0);
}
}
private void setCellEditor(int columnPosition, TableCellEditor editor) {
TableColumn col = getColumnModel().getColumn(columnPosition);
col.setCellEditor(editor);
}
private void setCellRenderer(int columnPosition, TableCellRenderer renderer) {
TableColumn col = getColumnModel().getColumn(columnPosition);
col.setCellRenderer(renderer);
}
private class EditorAutomaticCloser implements TableModelListener {
private DefaultTableModel model;
EditorAutomaticCloser(DefaultTableModel model) {
this.model = model;
}
public void tableChanged(TableModelEvent event) {
model.removeTableModelListener(this);
cancelAllEditors();
model.addTableModelListener(this);
}
private void cancelAllEditors() {
for (int i = 0; i < getColumnCount(); i++) {
TableCellEditor tce = getColumn(getColumnName(i)).getCellEditor();
if (tce != null) {
tce.cancelCellEditing();
}
}
}
}
private class MyHeaderRenderer extends JLabel implements TableCellRenderer {
MyHeaderRenderer() {
setOpaque(true);
setHorizontalAlignment(SwingConstants.CENTER);
setHorizontalTextPosition(SwingConstants.RIGHT);
setVerticalTextPosition(SwingConstants.CENTER);
setBorder(new EtchedBorder(EtchedBorder.LOWERED));
}
public void changeHeaderRenderer(JTable tbl) {
int nbColumn = getColumnCount();
for (int i = 0; i < nbColumn; i++) {
TableColumn aCol = tbl.getColumn(getColumnName(i));
aCol.setHeaderRenderer(this);
}
}
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
setText((String)value);
setEnabled(table.isEnabled());
return this;
}
}
private static class MyTableCellRenderer extends JLabel implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
setText((String)value);
setEnabled(table.isEnabled());
return this;
}
}
}